home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / passwrd3.arc / PASSWRD3.ASM < prev    next >
Assembly Source File  |  1985-02-25  |  7KB  |  264 lines

  1. PAGE 60,132
  2. TITLE PASSWRD3.ASM - PASSWRD3.SYS DEVICE DRIVER
  3. ;------------------------------------------------------------
  4. ;PASSWRD3.ASM (CREATES PASSWRD3.SYS, DEVICE DRIVER)
  5. ;DOS 2.00 DEVICE DRIVER FORCES USER TO ENTER PASSWORD ON BOOTING UP
  6. ;AND DISABLES Ctrl-Break.
  7. ;
  8. ; REV by JOHN R. PETROCELLI   02/25/85
  9. ;
  10. ; ADDITIONAL CODE HAS BEEN ADDED TO INITIALIZE INT 66h WITH THE
  11. ; SEGMENT AND OFFSET OF THE "RECALL" CODE (ASK_OFF). USING THE
  12. ; PROGRAM "LOCK.COM" WILL ENABLE THE USER TO DISBLE THE USE OF THE
  13. ; PC UNTIL THE CORRECT PASSWORD IS SUPPLIED.
  14. ;
  15. ;AFTER ASSEMBLY: LINK PASSWRD3 (ignore "no STACK" error)
  16. ;                EXE2BIN PASSWRD3 PASSWRD3.SYS
  17. ;                PLACE DEVICE=PASSWRD3.SYS IN CONFIG.SYS FILE
  18. ;                REBOOT SYSTEM WITH Ctrl-Alt-Del
  19. ;                ANSWER PROMPT WITH: Password <ENTER>
  20. ;                **** BEWARE OF UPPER VS LOWER CASE ****
  21. ;
  22.  
  23. DEV_SEG SEGMENT
  24. PWORD_DEVICE PROC FAR
  25.         ASSUME CS:DEV_SEG, DS:DEV_SEG, ES:DEV_SEG
  26.  
  27. ;---------------------------------------------------------------
  28. ;The following lines are the device header, which must exist for
  29. ;every device. This file has only one device, and it works with
  30. ;character I/O. It doesn't actually handle any I/O services,
  31. ;but it's easier to create a character device.
  32.  
  33. PWORD_DEV_HEADER:    ;label for the start of the device driver
  34.  
  35. NEXT_DEV_PTR    DD  -1     ;only 1 device is defined in this file
  36. DEV_ATTRIBUTE   DW  1000000000000000B
  37. STRATEGY_PTR    DW  STRATEGY   ;the installation procedure
  38. INTERUPT_PTR    DW  INTERUPT   ;the proc that handles all services
  39. DEVICE_NAME     DB  'PWORD'    ;8-byte string of device name
  40.  
  41. ; -- This is the storage area for the password --
  42. ; -- The first byte is the length (0-16) --------
  43. ; -- The following characters are the password --
  44. ; -- Only an exact match will allow the system --
  45. ; -- to continue the boot process ---------------
  46.  
  47. PASSWORD_STORE DB 4,'plan'
  48.                DB $-PASSWORD_STORE DUP(' ')  ;leave room for a
  49.                                              ;16-character password
  50.  
  51. IN_BUF_MAX DB 16
  52. IN_BUF_LEN DB ?
  53. IN_BUF     DB 16 DUP(?)
  54.  
  55. BREAK_SEG  DW
  56. BREAK_OFF  DW
  57.  
  58. ; -- The STRATEGY proc stores ES:BX request header pointer here
  59. ; -- The INTERUPT proc retrieves it
  60.  
  61. REQUEST_PTR LABEL DWORD
  62. REQ_PTR_OFF DW
  63. REQ_PTR_SEG DW    ?
  64.  
  65. DUMMY_IRET  DB  207     ;Ctrl-Break vector is pointed here, so it
  66.                         ;does nothing. Break is not recognized!
  67.  
  68. ;---------------------- Messages ----------------------------------
  69. ;These messages are expected to be output via the ANSI.SYS device,
  70. ;so it should be installed (named in the CONFIG.SYS file) before
  71. ;this PWORD device.
  72. ;If you don't want to use ANSI.SYS, remove the ESC sequences in the
  73. ;messages.
  74.  
  75. LF EQU 0AH
  76. CR EQU 0DH
  77. ESC EQU 1BH
  78.  
  79. MSG_1 DB CR,LF,ESC,'[0m'      ;make output visible
  80.       DB 'Enter '
  81.       DB ESC,'[5m'            ;make output blink
  82.       DB 'Password: '
  83.       DB ESC,'[8m$'           ;make input invisible
  84.  
  85. MSG_2 DB CR,LF,ESC,'[0m'      ;make output visible
  86.       DB 'Password accepted.',CR,LF,'$'
  87.  
  88. ;====================================================================
  89. ;STRATEGY procedure
  90. ;Just saves the request header pointer for the INTERUPT proc
  91.  
  92. STRATEGY PROC FAR
  93.          ASSUME CS:DEV_SEG
  94.          MOV    CS:REQ_PTR_OFF,BX
  95.          MOV    CS:REQ_PTR_SEG,ES
  96.          RET
  97. STRATEGY ENDP
  98.  
  99. ;====================================================================
  100.  
  101. NO_BREAK PROC NEAR
  102.  
  103. ;The following 8 lines eliminate Ctrl-Break from having any effect
  104. ;on the system, unless another program KEYBOARD_BREAK vector is
  105. ;altered (BASIC does that).
  106. ; OLD BREAK VECTOR IS STORED SO THAT IT MAY BE RESET
  107.  
  108.          MOV    AX,0
  109.          MOV    ES,AX
  110.          MOV    AX,WORD PTR ES:[1Bh*4]
  111.          MOV    BREAK_SEG,AX
  112.          MOV    AX,WORD PTR ES:[1Bh*4+2]
  113.          MOV    BREAK_OFF,AX
  114.          MOV    WORD PTR ES:[1Bh*4],OFFSET DUMMY_IRET
  115.          MOV    WORD PTR ES:[1Bh*4+2],CS
  116.          RET
  117.  
  118. NO_BREAK ENDP
  119.  
  120. BREAK_ON  PROC NEAR
  121.  
  122. ; THE FOLLOWING 6 LINES RESTORE THE CTL-BREAK VECTOR
  123.  
  124.          MOV    AX,0
  125.          MOV    ES,AX
  126.          MOV    AX,BREAK_SEG
  127.          MOV    WORD PTR ES:[1Bh*4],AX
  128.          MOV    AX,BREAK_OFF
  129.          MOV    WORD PTR ES:[1Bh*4+2],AX
  130.          RET
  131.  
  132. BREAK_ON  ENDP
  133.  
  134. ;====================================================================
  135. ASK_PWRD  PROC NEAR
  136. ;
  137. ; This code prompts the user for the correct password
  138. ;
  139.  
  140.          JMP    SHORT NO_BEEP
  141. TRY_AGAIN:
  142.          MOV    AL,7
  143.          MOV    AH,0EH
  144.          INT    10H
  145. NO_BEEP:
  146.          MOV    DX,OFFSET MSG_1    ;"Enter Password: "
  147.          MOV    AH,9
  148.          INT    21H
  149.  
  150.          MOV    DX,OFFSET IN_BUF_MAX
  151.          MOV    AH,0CH
  152.          MOV    AL,0AH
  153.          INT    21H
  154.          MOV    AX,CS
  155.          MOV    ES,AX
  156.  
  157.          MOV    SI,OFFSET IN_BUF_LEN
  158.          MOV    DI,OFFSET PASSWORD_STORE
  159.          MOV    CH,0
  160.          MOV    CL,[SI]
  161.          CMP    CL,[DI]
  162.          JNE    TRY_AGAIN
  163.          INC    DI
  164.          INC    SI
  165.          REP    CMPSB
  166.          JNE    TRY_AGAIN
  167.  
  168.          MOV    DX,OFFSET MSG_2    ;"Password acceped"
  169.          MOV    AH,9
  170.          INT    21H
  171.  
  172.          RET
  173.  
  174. ASK_PWRD  ENDP
  175.  
  176. ;=====================================================================
  177. ;INTERUPT procedure
  178. ;Processes the command indicated in the request header.
  179.  
  180. INTERUPT PROC FAR
  181.          ASSUME CS:DEV_SEG, DS:NOTHING, ES:NOTHING
  182.          PUSH   DS
  183.          PUSH   ES
  184.          PUSH   AX
  185.          PUSH   BX
  186.          PUSH   CX
  187.          PUSH   DX
  188.          PUSH   DI
  189.          PUSH   SI
  190.          MOV    AX,CS
  191.          MOV    DS,AX
  192.  
  193.          LES    BX,REQUEST_PTR
  194.          MOV    AL,ES:[BX+2]
  195.          CMP    AL,0
  196.          JNE    ERROR_EXIT
  197.          JMP    INIT_FN
  198. ERROR_EXIT:
  199.          OR     WORD PTR ES:[BX+3],8003H
  200.          JMP    EXIT
  201. COMMON_EXIT:
  202.          OR     WORD PTR ES:[BX+3],100H
  203.  
  204. ; THE FOLLOWING 6 LINES SET THE REFERENCE FOR RECALL.
  205. ; LOCATION AT INT 66H IS USED FOR ADDRESS STORE
  206.  
  207.          MOV    AX,0
  208.          MOV    ES,AX
  209.          MOV    AX,CS
  210.          MOV    DS,AX
  211.          MOV    AX,OFFSET ASK_OFF
  212.          MOV    WORD PTR ES:[66H*4],AX
  213.          MOV    AX,CS
  214.          MOV    WORD PTR ES:[66H*4+2],AX
  215. EXIT:
  216.          POP    SI
  217.          POP    DI
  218.          POP    DX
  219.          POP    CX
  220.          POP    BX
  221.          POP    AX
  222.          POP    ES
  223.          POP    DS
  224.          RET
  225. ASK_OFF:
  226.          PUSH   DS
  227.          PUSH   ES
  228.          PUSH   AX
  229.          PUSH   BX
  230.          PUSH   CX
  231.          PUSH   DX
  232.          PUSH   DI
  233.          PUSH   SI
  234.          MOV    AX,CS
  235.          MOV    DS,AX
  236.  
  237.          CALL   NO_BREAK
  238.  
  239.          CALL   ASK_PWRD
  240.  
  241.          CALL   BREAK_ON
  242.  
  243.          JMP    EXIT
  244.  
  245. INIT_FN PROC NEAR
  246.          PUSH   ES
  247.  
  248.          CALL   NO_BREAK
  249.  
  250.          CALL   ASK_PWRD
  251.  
  252.          CALL   BREAK_ON
  253.  
  254.          POP    ES
  255.          MOV    WORD PTR ES:[BX+0EH],OFFSET INIT_FN
  256.          MOV    WORD PTR ES:[BX+10H],CS
  257.  
  258.          JMP    COMMON_EXIT
  259. INIT_FN  ENDP
  260. INTERUPT ENDP
  261. PWORD_DEVICE    ENDP
  262. DEV_SEG  ENDS
  263.          END PWORD_DEV_HEADER
  264.